package com.sh.rbac.domain.converter;

import com.sh.rbac.domain.dto.job.JobSaveDTO;
import com.sh.rbac.domain.dto.job.JobUpdateDTO;
import com.sh.rbac.domain.entity.Job;
import com.sh.rbac.domain.vo.job.JobVO;
import com.sh.rbac.utils.TaskUtils;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * 任务对象转换器
 *
 * @author wb
 * @since 2024-08-05
 */

@Mapper
public interface JobConverter {

    JobConverter INSTANCE = Mappers.getMapper(JobConverter.class);


    /**
     * 将 JobSaveDTO 转换为 Job
     *
     * @param jobSaveDTO 任务保存数据传输对象
     * @return 任务实体类
     */
    Job toEntity(JobSaveDTO jobSaveDTO);


    /**
     * 将 JobUpdateDTO 转换为 Job
     *
     * @param jobUpdateDTO 任务更新数据传输对象
     * @return 任务实体类
     */
    Job toEntity(JobUpdateDTO jobUpdateDTO);


    /**
     * 将 Job 转换为 JobVO
     *
     * @param job 任务实体类
     * @return 任务视图对象
     */
    @Mapping(target = "nextExecTime", ignore = true)
    JobVO toVO(Job job);

    /**
     * 将 List<Job> 转换为 List<JobVO>
     *
     * @param jobs 任务实体类集合
     * @return 任务视图集合
     */
    List<JobVO> toVoList(List<Job> jobs);


    /**
     * 设置任务视图对象中的 nextExecTime 属性
     */
    @AfterMapping  // 映射完后执行
    default void setNextExecTime(Job job, @MappingTarget JobVO jobVO) {
        jobVO.setNextExecTime(TaskUtils.getNextJobExecutionDate(job.getCronExpression()));
    }
}
